// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/events/scoped_target_handler.h"

#include "ui/events/event.h"
#include "ui/events/event_handler.h"
#include "ui/events/event_target.h"

namespace ui {

ScopedTargetHandler::ScopedTargetHandler(EventTarget* target,
    EventHandler* handler)
    : destroyed_flag_(NULL)
    , target_(target)
    , new_handler_(handler)
{
    original_handler_ = target_->SetTargetHandler(this);
}

ScopedTargetHandler::~ScopedTargetHandler()
{
    EventHandler* handler = target_->SetTargetHandler(original_handler_);
    DCHECK_EQ(this, handler);
    if (destroyed_flag_)
        *destroyed_flag_ = true;
}

void ScopedTargetHandler::OnEvent(Event* event)
{
    if (original_handler_) {
        bool destroyed = false;
        bool* old_destroyed_flag = destroyed_flag_;
        destroyed_flag_ = &destroyed;

        original_handler_->OnEvent(event);

        if (destroyed) {
            if (old_destroyed_flag)
                *old_destroyed_flag = true;
            return;
        }
        destroyed_flag_ = old_destroyed_flag;
    }
    new_handler_->OnEvent(event);
}

} // namespace ui
